//Copyright (c) 2010, Information Security Institute of Wuhan Universtiy(ISIWhu)
//All rights reserved.
//
//PLEASE READ THIS DOCUMENT CAREFULLY BEFORE UTILIZING THE PROGRAM
//BY UTILIZING THIS PROGRAM, YOU AGREE TO BECOME BOUND BY THE TERMS OF
//THIS LICENSE.  IF YOU DO NOT AGREE TO THE TERMS OF THIS LICENSE, DO
//NOT USE THIS PROGRAM OR ANY PORTION THEREOF IN ANY FORM OR MANNER.
//
//This License allows you to:
//1. Make copies and distribute copies of the Program's source code provide that any such copy 
//   clearly displays any and all appropriate copyright notices and disclaimer of warranty as set 
//   forth in this License.
//2. Modify the original copy or copies of the Program or any portion thereof ("Modification(s)"). 
//   Modifications may be copied and distributed under the terms and conditions as set forth above. 
//   Any and all modified files must be affixed with prominent notices that you have changed the 
//   files and the date that the changes occurred.

//Termination:
//   If at anytime you are unable to comply with any portion of this License you must immediately 
//   cease use of the Program and all distribution activities involving the Program or any portion 
//   thereof.

//Statement:
//   In this program, part of the code is from the GTNetS project, The Georgia Tech Network 
//   Simulator (GTNetS) is a full-featured network simulation environment that allows researchers in 
//   computer networks to study the behavior of moderate to large scale networks, under a variety of 
//   conditions. Our work have great advance due to this project, Thanks to Dr. George F. Riley from 
//   Georgia Tech Research Corporation. Anyone who wants to study the GTNetS can come to its homepage:
//   http://www.ece.gatech.edu/research/labs/MANIACS/GTNetS/
//


//File Information:
//
//
//File Name:
//File Purpose:
//Original Author:
//Author Organization:
//Construct Data:
//Modify Author:
//Author Organization:
//Modify Data:



// Georgia Tech Network Simulator - Layer 2 Protocol base class
// George F. Riley.  Georgia Tech, Spring 2002

#ifndef __l3protocol_h__
#define __l3protocol_h__

#include "G_common_defs.h"
#include "ipaddr.h"
#include "protocol.h"
#include "pdu.h"

class Node;
class Packet;
class Interface;

//Doc:ClassXRef
class L3Protocol : public Protocol {
public:
  virtual Layer_t Layer () { return 3; }
  virtual void DataRequest(Node*, Packet*, void*) = 0; // From higher layer
  virtual void DataIndication(Interface* ,Packet*) = 0;// From lower layer
  virtual Interface* PeekInterface(Node*, void*) = 0;  // Find forwarding if
  virtual Count_t Version() = 0;                       // Get IP version number
  virtual Proto_t Proto() = 0;                         // Get protocol number
};

//Doc:ClassXRef
class L3PDU : public PDU {
public:
  //Doc:Class Class {\tt L3PDU} is the base class for all layer three
  //Doc:Class protocol data units.  All L3PDU's must implement
  //Doc:Class the GetSrcIP and GetDstIP methods.
public:
  virtual Layer_t Layer()  {return 3;}
  //Doc:Method
  virtual IPAddr_t GetSrcIP() = 0;
    //Doc:Desc Return the source IP address.
    //Doc:Return source IP Address

  //Doc:Method
  virtual IPAddr_t GetDstIP() = 0;
    //Doc:Desc Return the destination IP address.
    //Doc:Return destination IP Address
};

#endif
